package cn.iocoder.yudao.module.mqtt.util;

import cn.hutool.core.util.ObjectUtil;
import lombok.extern.slf4j.Slf4j;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.HashMap;
import java.util.Map;

@Slf4j
public class MqttDeviceUtil {


    /**
     * 将从 Map 中获取的第一个参数除以第二个参数，并返回保留指定小数位数的结果。
     *
     * @param map       包含第一个参数的 Map
     * @param key       用于从 Map 中获取第一个参数的键
     * @param value     第二个参数
     * @param scale     保留的小数位数
     * @return          保留指定小数位数的结果
     */
    public static String divideValues(Map<String, Object> map, String key, String value, int scale) {
        // 检查 Map 是否包含键，并且对应的值不为空
        if (ObjectUtil.isNotEmpty(map.get(key))) {
            String firstValue = map.get(key).toString();
            // 检查第二个参数是否为空
            if (value != null && !value.isEmpty()) {
                try {
                    // 使用 BigDecimal 进行精确的除法运算
                    BigDecimal result = new BigDecimal(firstValue).divide(new BigDecimal(value), scale, RoundingMode.HALF_UP);

                    String message = String.format("格式化数据 原来的值： %s ， 转换后的值 ：%s", firstValue, result);
                    log.debug(" - ------------------ " +  message);
                    // 返回结果，保留指定的小数位数
                    return result.toPlainString();
                } catch (NumberFormatException e) {
                    // 如果转换失败，返回错误信息
                    return "Invalid input: One or both values are not valid numbers.";
                } catch (ArithmeticException e) {
                    // 如果除数为 0，返回错误信息
                    return "Invalid input: Division by zero.";
                }
            } else {
                return "Invalid input: The second value is empty.";
            }
        } else {
            return "Invalid input: The key '" + key + "' is not present in the map or its value is empty.";
        }
    }

    /**
     * 判断数据是否超出范围
     * @param payloadValue
     * @param greaterValue
     * @param lessValue
     * @return
     */
    public static boolean isOutOfRange(String payloadValue, String greaterValue, String lessValue) {
        try {
            // 将字符串转换为 BigDecimal
            BigDecimal payloadValueDecimal = new BigDecimal(payloadValue);
            BigDecimal lower = new BigDecimal(greaterValue); // 下限值
            BigDecimal upper = new BigDecimal(lessValue);   // 上限值

            // 输出调试信息
            System.out.println("下限值: " + lower + "; 实际值: " + payloadValueDecimal + "; 上限值: " + upper);
            // 判断实际值是否在范围内
            // 如果实际值小于下限值或大于上限值，则返回 true，表示超出范围
            // 否则返回 false，表示在范围内
            return payloadValueDecimal.compareTo(lower) < 0 || payloadValueDecimal.compareTo(upper) > 0;
        } catch (NumberFormatException e) {
            // 如果输入的字符串无法转换为数字，则返回 false
            return false;
        }
    }
    public static void main(String[] args) {
        Map<String, Object> map = new HashMap<>();
        map.put("WD", "421.20");
        // 示例测试
        String result = divideValues(map, "WD", "1000",4);
        System.out.println("result:"+ result); // 输出：50.0

        System.out.println("是否超出范围:"+ isOutOfRange("0.54773", "0", "0.55"));
    }
}
